package com.obelisco.vista.plantillas;

import java.util.List;

import nextapp.echo2.app.Component;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.extras.app.TabPane;

import com.obelisco.vista.componentes.BotonesDialogo;
import com.obelisco.vista.componentes.Catalogo;
import com.obelisco.vista.componentes.DialogoError;
import com.obelisco.vista.componentes.DialogoMensaje;
import com.obelisco.vista.componentes.TipoAccion;
import com.obelisco.vista.componentes.TipoDialogo;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.componentes.TipoVentana;
import com.obelisco.vista.componentes.Ventana;
import com.obelisco.vista.componentes.VentanaListener;

public abstract class VentanaDialogoBase extends VentanaBase {

	private Component padre;

	private DialogoMensaje dialogo;

	private String mensajeError = "Error al Ingresar los Datos";

	private ActionListener listenerAccionBotones = null;

	private TipoFuncion tipoFuncion;

	private String nombreFuncion;

	private TipoAccion accionSeleccionada;

	private ActionListener manejadorEventoDialogo = new ActionListener() {
		public void actionPerformed(ActionEvent evento) {
			dialogo.salir();
		}
	};

	public VentanaDialogoBase() {
		super("", TipoVentana.DIALOGO);
		this.addVentanaListener(eventosVentana);
	}
	
	// Evento para el Manejo de Ventanas
	public VentanaListener eventosVentana = new VentanaListener() {

		public void onMostrar(Ventana ventana) {
			onConfigurar();
		}

		public void onSalir(Ventana ventana, boolean cerrar) {
			//onCancelar();
		}
	};
  

	public abstract void setObjetoEntidad(Object objetoEntidad);
	
	public abstract void setParametros(List listaParametros);

	public abstract Object getObjetoEntidad();

	//public abstract void configurarControles();

	public abstract void onFuncionPersonalizada(Object objeto,TipoFuncion tipoFuncion,String nombre);

	public abstract void inicializar();
	
	protected abstract void onCancelar();

	public abstract void onIncluir(Object objeto);

	public abstract void onModificar(Object objeto);

	public abstract void onConsultar(Object objeto);
	
	public abstract void onConfirmarCambios(Object objeto, TipoFuncion funcion,String nombre);

	public abstract boolean onValidarDatos(Object objeto, TipoFuncion funcion,String nombre);

	public void onConfigurar() {
		//getAreaTrabajo().removeAll();

		//configurarControles();

		//distribuirEventoInicializar();
		
		if ( isUsarTab() )
		{
			((TabPane)this.getAreaTrabajo()).setActiveTabIndex(0);
		}
		
		
		inicializar();

		//distribuirEventoConfigurarControles(getTipoFuncion(),
		//		getNombreFuncion());

		if (getTipoFuncion() == TipoFuncion.INCLUIR) {
			onIncluir(getObjetoEntidad());
		} else if (getTipoFuncion() == TipoFuncion.MODIFICAR) {
			onModificar(getObjetoEntidad());
		} else if (getTipoFuncion() == TipoFuncion.BUSCAR) {
			onConsultar(getObjetoEntidad());
		}
		else {
			onFuncionPersonalizada(getObjetoEntidad(), getTipoFuncion(), nombreFuncion);
		}
	}

	@Override
	protected void accion(TipoAccion accion, TipoFuncion funcion, String nombre) {
		accionSeleccionada = accion;
		
		if ( this instanceof Catalogo) {
			Catalogo catalogo = (Catalogo) this;
			if (accion == accion.ACEPTAR) {
				if (catalogo.getTabla().getFilasSeleccionadas() == null) {
					DialogoError.mostrar("Error", 102);
					return;
				} 
				else {						
					catalogo.seleccionarElemento();
				}
			}
		}
		
		if ((accion == accion.ACEPTAR) && ((getTipoFuncion() == funcion.INCLUIR) || (getTipoFuncion() == funcion.MODIFICAR) || (getTipoFuncion() == funcion.DEFINIDA_USUARIO))) {
			
			
			if (onValidarDatos(getObjetoEntidad(),getTipoFuncion(), getNombreFuncion())){// && distribuirEventoValidarDatos()) {
				//distribuirEventoAccionGuardar(getTipoFuncion(),
				//		getNombreFuncion());
				onConfirmarCambios(getObjetoEntidad(), getTipoFuncion(), getNombreFuncion());
				if (listenersImprimir.size() > 0)
				{
					if ((listenersImprimir.get(0)).onAceptar())
					{
						/*if (onValidarDatos(getObjetoEntidad(), funcion, nombre))									
						{*/
							if ((listenersImprimir.get(0)).onValidarImprimir())
							{
								//onConfirmarCambios(getObjetoEntidad(), funcion, nombre);	
								onImprimir();
								/*instanciarObjetoEntidad();
								inicializar();*/
							} 
							else 
							{
								dialogo = DialogoMensaje.mostrar("Error", mensajeError, TipoDialogo.ERROR, BotonesDialogo.OK, manejadorEventoDialogo);
							}							
						//}
						/*else
						{
							dialogo = DialogoMensaje.mostrar("Error", mensajeError, TipoDialogo.ERROR, BotonesDialogo.OK, manejadorEventoDialogo);
						}*/
					}
					/*else
					{
						if (onValidarDatos(getObjetoEntidad(), funcion, nombre)){
							onConfirmarCambios(getObjetoEntidad(), funcion, nombre);								
							instanciarObjetoEntidad();
							inicializar();
						} else {
							dialogo = DialogoMensaje.mostrar("Error", mensajeError, TipoDialogo.ERROR, BotonesDialogo.OK, manejadorEventoDialogo);
						}						
					}*/
				}
				this.salir();
			} else {
				dialogo = DialogoMensaje.mostrar("Error", mensajeError, TipoDialogo.ERROR, BotonesDialogo.OK, manejadorEventoDialogo);
			}
		} else if (accion == accion.CANCELAR) {
			this.salir();
			onCancelar();
		} else if ((accion == accion.ACEPTAR) && ((getTipoFuncion() == null) || (getTipoFuncion() == TipoFuncion.BUSCAR))) 
		{
			if (!onValidarDatos(getObjetoEntidad(),getTipoFuncion(), getNombreFuncion()))
			{
				dialogo = DialogoMensaje.mostrar("Error", mensajeError, TipoDialogo.ERROR, BotonesDialogo.OK, manejadorEventoDialogo);
			}
			this.salir();
			/*else if ( this instanceof Catalogo) {
				Catalogo catalogo = (Catalogo) this;
				if (accion == accion.ACEPTAR) {
					if (catalogo.getTabla().getFilasSeleccionadas() == null) {
						DialogoError.mostrar("Error", 102);
					} else {						
						catalogo.seleccionarElemento();
						this.salir();
					}
				} else if (accion == accion.CANCELAR) {
					this.salir();
				}
			}*/
		}
	}
	
	@Override
	protected void funcion(TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub		
	}

	public TipoFuncion getTipoFuncion() {
		return tipoFuncion;
	}

	public void setTipoFuncion(TipoFuncion tipoFuncion) {
		this.tipoFuncion = tipoFuncion;
	}

	public Component getPadre() {
		return padre;
	}

	public void setPadre(Component padre) {
		this.padre = padre;
	}

	public TipoAccion getAccionSeleccionada() {
		return accionSeleccionada;
	}

	public String getNombreFuncion() {
		return nombreFuncion;
	}

	public void setNombreFuncion(String nombreFuncion) {
		this.nombreFuncion = nombreFuncion;
	}

	public void transferirEntidad(Object object) {
		//distribuirEventoSetObjetoEntidad(object);
		setObjetoEntidad(object);
	}
	
	public void transferirParametros(List listaParametros) {
		//distribuirEventoSetObjetoEntidad(object);
		setParametros(listaParametros);
	}

	public void setAccionSeleccionada(TipoAccion accionSeleccionada) {
		this.accionSeleccionada = accionSeleccionada;
	}

}
